package com.bigdata

import java.util.Scanner

object Demo2Base {

  def main(args: Array[String]): Unit = {
    /**
     * 变量
     * 可变：var
     * 不可变（常量）: val
     * 尽量使用val
     */
    // 给我一批数据，经过处理，得到xxx的结果
    // 一般是没有修改数据的需求的，val使用的更多
    // val => final, final 修饰的变量相当于常量
    // Int -> Integer
    val num: Int = 100 // final Integer num = 100
    // num = 20

    // var 变量
    var str: String = "scala"
    str = "hadoop"
    println(str)

    /**
     * 类型推断
     * 变量类型会自动通过等号右边的值推断出来
     */
    val _pi = 3.14F
    println(_pi)
    // 打印类型
    println(_pi.getClass)

    // 打印多个字段,使用 $变量 引用，如果有特殊字符，使用{}包起来
    println(s"num:$num,str:$str,pi:${_pi}")

    /**
     * 2、字符串
     * scala中的字符串和java中的字符串是同一个，java中字符串有的方法在scala中都有
     *
     * scala和java兼容：java中的类在scala中可以使用，scala中的类在java中也可以使用
     * scala和java的语法不一样
     */
    val info: String = "hadoop,hive,hbase,scala"
    val arr: Array[String] = info.split(",")
    println(arr)

    // 打印数组值
    val arrStr: String = arr.mkString("-")
    println(arrStr)

    /**
     * 字符串拼接
     * 1、使用+, 性能较差，会占用而外的内存空间
     * 2、StringBuffer,StringBuilder
     * 3、scala中的方法(推荐)
     */
    val sb: StringBuilder = new StringBuilder()
    sb.append("hello-")
    sb.append("world")
    println(sb)

    //3、scala中的方法
    val s1 = "java"
    val i1 = 100
    val d1 = 3.14

    //底层也是StringBuilder，只是scala中的一种简写
    val str2: String = s"${s1}_${i1}_$d1"
    println(str2)

    //1、使用+
    // String 是final修饰的，是一个不可变类，为什么值可以改变？
    var str3 = "hello"
    str3 = "world"
    println(s"str3$str3")
    val str1: String = "java" + "," + "hadoop" + "," + "spark"
    println(str1)

    println("=" * 100)


    /**
     * 数组：
     */
    // 创建数组
    val arr1: Array[Int] = Array(1, 2, 3, 4, 8, 3, 4, 1)
    val arrStr1: String = arr1.mkString("-")
    println(arrStr1)

    // 根据下标修改指定的元素值
    arr1(0) = 11

    // 查询指定下标的元素
    println(arr1(2))

    // 遍历数组, scala不支持for i++这种语法
    // for(var i:Int = 0; i < arr1.length;i++) {}

    var index: Int = 0

    while (index < arr1.length) {
      print(s"${arr1(index)}\t")

      // scala 不支持++
      // index++
      index += 1
    }
    println()

    // "=" 拼接100次
    println("=" * 100)

    /**
     * 算术运算符
     */
    val num1: Int = 10
    val num2: Int = 3
    println(num1 + num2)
    println(num1 - num2)
    println(num1 * num2)
    println(num1 / num2)
    println(num1 % num2)

    println("=" * 100)

    /**
     * 流程控制
     * 分支、循环
     */
    //    val sc: Scanner = new Scanner(System.in)
    //    print("请输入年龄：")
    //    val age: Int = sc.nextInt()
    //    if(age <= 18) {
    //      println("未成年")
    //    } else if(age > 18 & age < 50) {
    //      println("中年")
    //    } else {
    //      println("老年")
    //    }

    println()
    println("=" * 100)

    var num3: Int = 0

    while (num3 < 100) {
      print(s"$num3\t")
      num3 += 1
    }

    println("=" * 100)

    val arr2: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)

    // Iterator是scala包下的迭代器
    val iter: Iterator[Int] = arr2.iterator

    while (iter.hasNext) {
      val num: Int = iter.next()
      println(num)
    }

    println("=" * 100)

    // 增强for循环遍历，底层就是迭代器
    for (num <- arr2) {
      println(num)
    }


  }

}
